package com.hzvtc.myproject.service;

import com.hzvtc.myproject.dao.BuildingMapper;
import com.hzvtc.myproject.entity.Building;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

@Service
public class BuildingService {
    @Autowired
    private BuildingMapper buildingMapper;

    /**
     * 获取建筑物列表
     *
     * @return 建筑物列表
     */
    public List<Building> list() {
        List<Building> list = buildingMapper.list(null);
        traverseTree(list);
        return list;
    }

    /**
     * 根据ID查询建筑物
     *
     * @param id 建筑物ID
     * @return 查询到的建筑物对象，如果不存在则返回空Optional
     */
    public Optional<Building> query(Long id) {
        return buildingMapper.query(id);
    }

    /**
     * 获取所有建筑物列表
     *
     * @return 所有建筑物列表
     */
    public List<Building> listAll() {
        return buildingMapper.listAll();
    }

    /**
     * 遍历建筑物树，设置每个建筑物的学生数量和房间数量
     *
     * @param list 建筑物列表
     */
    private void traverseTree(List<Building> list) {
        list.forEach(building -> {
            List<Long> result = new ArrayList<>(16);
            result.add(building.getId());
            getIdsByParentId(building.getId(), result);
            int studentNum = buildingMapper.countStudentByBuildingIds(result);
            int roomNum = buildingMapper.countRoomByBuildingIds(result);
            building.setStudentNum(studentNum);
            building.setRoomNum(roomNum);
            traverseTree(building.getChildren());
        });
    }

    /**
     * 根据父级建筑物ID获取所有相关联的建筑物ID
     *
     * @param bId 父级建筑物ID
     * @return 相关联的建筑物ID列表
     */
    public List<Long> getIdsByParentId(Long bId) {
        List<Long> res = new ArrayList<>(16);
        res.add(bId);
        getIdsByParentId(bId, res);
        return res;
    }

    /**
     * 递归获取父级建筑物ID的所有子级建筑物ID
     *
     * @param bId    父级建筑物ID
     * @param result 建筑物ID结果列表
     */
    private void getIdsByParentId(Long bId, List<Long> result) {
        List<Long> childrenIds = buildingMapper.listByParentId(bId);
        result.addAll(childrenIds);
        childrenIds.forEach(l -> getIdsByParentId(l, result));
    }

    /**
     * 新增建筑物
     *
     * @param building 建筑物对象
     */
    public void save(Building building) {
        buildingMapper.insert(building);
    }

    /**
     * 更新建筑物
     *
     * @param building 建筑物对象
     */
    public void update(Building building) {
        buildingMapper.update(building);
    }

    /**
     * 删除建筑物及其所有子级建筑物
     *
     * @param id 建筑物ID
     */
    public void delete(Long id) {
        List<Long> list = buildingMapper.listByParentId(id);
        list.forEach(this::delete);
        buildingMapper.delete(id);
    }
}
